package cn.icatw.leetcode.editor.cn;
//给你一个由 n 个数对组成的数对数组 pairs ，其中 pairs[i] = [lefti, righti] 且 lefti < righti 。
//
// 现在，我们定义一种 跟随 关系，当且仅当 b < c 时，数对 p2 = [c, d] 才可以跟在 p1 = [a, b] 后面。我们用这种形式来构造 数
//对链 。
//
// 找出并返回能够形成的 最长数对链的长度 。
//
// 你不需要用到所有的数对，你可以以任何顺序选择其中的一些数对来构造。
//
//
//
// 示例 1：
//
//
//输入：pairs = [[1,2], [2,3], [3,4]]
//输出：2
//解释：最长的数对链是 [1,2] -> [3,4] 。
//
//
// 示例 2：
//
//
//输入：pairs = [[1,2],[7,8],[4,5]]
//输出：3
//解释：最长的数对链是 [1,2] -> [4,5] -> [7,8] 。
//
//
//
// 提示：
//
//
// n == pairs.length
// 1 <= n <= 1000
// -1000 <= lefti < righti <= 1000
//
//
// Related Topics 贪心 数组 动态规划 排序 👍 445 👎 0


import java.util.Arrays;

//Java：最长数对链
public class T646_MaximumLengthOfPairChain{
    public static void main(String[] args) {
        Solution solution = new T646_MaximumLengthOfPairChain().new Solution();
        // TO TEST
    }
    //leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    public int findLongestChain(int[][] pairs) {
        Arrays.sort(pairs, (a, b) -> a[1] - b[1]);
        int n = pairs.length;
        int[] dp = new int[n];
        Arrays.fill(dp, 1);
        for (int i = 1; i < n; i++) {
            for (int j = 0; j < i; j++) {
                if (pairs[i][0] > pairs[j][1]) {
                    dp[i] = Math.max(dp[i], dp[j] + 1);
                }
            }
        }
        return Arrays.stream(dp).max().getAsInt();
    }
}
//leetcode submit region end(Prohibit modification and deletion)

}
